const fs = require('fs').promises; // 改为异步文件操作
const path = require('path');
// 导入所有配置类（假设这些类已改为异步load方法）
const logger = require('./logger')
const SkillNames = require('./configs/skill_names');
const NickNames = require('./configs/nick_names');
const LauncherConfig = require('./configs/launcher_config');

/**
 * 配置管理器：统一管理所有配置的加载、保存和访问
 * 单例模式，支持异步并行加载所有配置
 */
class ConfigManager {
    constructor() {
        // 配置文件根目录：对应 src/configs
        this.configRootDir = path.join(__dirname, '../configs');
        // 确保根目录存在（改为异步，但在构造函数中同步执行，不阻塞初始化）
        this.#ensureRootDir().catch(err =>
            logger.error(`[ConfigManager] 创建配置目录失败: ${err.message}`)
        );

        // 初始化各配置实例
        this.skillNames = new SkillNames(this.configRootDir);
        this.nickNames = new NickNames(this.configRootDir);
        this.launcher = new LauncherConfig(this.configRootDir);
    }

    /**
     * 私有方法：确保配置根目录存在（异步实现）
     */
    async #ensureRootDir() {
        try {
            await fs.access(this.configRootDir);
        } catch {
            // 目录不存在时创建
            await fs.mkdir(this.configRootDir, { recursive: true });
            logger.info(`[ConfigManager] 已创建配置根目录: ${this.configRootDir}`);
        }
    }

    /**
     * 异步并行加载所有配置（核心改造）
     * @returns {Promise} 所有配置加载完成的Promise
     */
    async loadAll() {
        logger.emptyLine();
        logger.info('[ConfigManager] 开始并行加载所有配置...');

        // 收集所有配置的异步load方法（关键：并行执行）
        const loadPromises = [
            this.skillNames.load(),
            this.nickNames.load(),
            this.launcher.load()
        ];

        // 等待所有加载完成（无论单个成功/失败）
        const results = await Promise.allSettled(loadPromises);

        // 统计加载结果
        const successCount = results.filter(r => r.status === 'fulfilled').length;
        const failCount = results.length - successCount;

        logger.info(`[ConfigManager] 所有配置加载完成 - 成功: ${successCount}, 失败: ${failCount}`);
        logger.emptyLine();

        return { successCount, failCount };
    }

    /**
     * 保存所有配置（保持同步或改为异步，根据实际需求）
     */
    async saveAll() { // 改为异步，与load风格统一
        logger.info('');
        logger.info('[ConfigManager] 开始保存所有配置...');

        try {
            // 可并行保存（如果配置间无依赖）
            await Promise.all([
                // this.skillNames.save(), // 根据实际需求决定是否启用
                this.nickNames.save(),
                this.launcher.save()
            ]);
            logger.info('[ConfigManager] 所有配置保存完成');
        } catch (err) {
            logger.error(`[ConfigManager] 部分配置保存失败: ${err.message}`);
        } finally {
            logger.info('');
        }
    }

    /**
     * 获取指定配置实例（保持原有接口）
     * @param {string} name 配置名称（如 'launcher'、'nickNames'）
     * @returns {Object} 配置实例
     */
    getConfig(name) {
        const configMap = {
            launcher: this.launcher,
            skillNames: this.skillNames,
            nickNames: this.nickNames
        };
        return name ? configMap[name] || null : { ...configMap };
    }
}

// 导出单例实例（全局唯一）
module.exports = new ConfigManager();
